﻿using System;


namespace DAL.Gateway
{
    public class Firebird : GDatos, IGDatos
    {
        /*
         * Continuaremos con el método Comando, procediendo de igual forma que en los anteriores. 
         * En este caso, además, implementaremos un mecanismo de “preservación” de los Comandos creados,
         * para acelerar su utilización. Esto es, cada procedimiento que sea accedido, se guardará 
         * en memoria hasta que la instancia del objeto se destruya. Para ello, declararemos una variable 
         * como HashTable para la clase, con el modificador Shared (compartida) que permite 
         * persistir la misma entre creaciones de objetos
         */
        static readonly System.Collections.Hashtable ColComandos = new System.Collections.Hashtable();

        public override sealed string CadenaConexion
        {
            get
            {
                if (MCadenaConexion.Length == 0)
                {
                    if (MBase.Length != 0 && MServidor.Length != 0)
                    {
                        var sCadena = new System.Text.StringBuilder("");
                        sCadena.Append("Server=<SERVIDOR>;");
                        sCadena.Append("DataBase=<BASE>;");
                        sCadena.Append("User=<USER>;");
                        sCadena.Append("Password=<PASSWORD>;");
                        sCadena.Append("Port=3050;Dialect=3; Charset=NONE;Role=;");
                        sCadena.Replace("<SERVIDOR>", Servidor);
                        sCadena.Replace("<BASE>", Base);
                        sCadena.Replace("<USER>", Usuario);
                        sCadena.Replace("<PASSWORD>", Password);

                        return sCadena.ToString();
                    }
                    throw new Exception("No se puede establecer la cadena de conexión en la clase Firebird");
                }
                return null;
            }// end get
            set
            { MCadenaConexion = value; } // end set
        }// end CadenaConexion

        protected override void CargarParametros(System.Data.IDbCommand com, Object[] args)
        {
            for (var i = 0; i < com.Parameters.Count; i++)
            {
                var p = (FirebirdSql.Data.FirebirdClient.FbParameter)com.Parameters[i];
                p.Value = i <= args.Length ? args[i] : null;
            }
        }

        protected override System.Data.IDbCommand Comando(string procedimientoAlmacenado)
        {
            FirebirdSql.Data.FirebirdClient.FbCommand com;
            if (ColComandos.Contains(procedimientoAlmacenado))
                com = (FirebirdSql.Data.FirebirdClient.FbCommand)ColComandos[procedimientoAlmacenado];
            else
            {
                var con2 = new FirebirdSql.Data.FirebirdClient.FbConnection(CadenaConexion);
                con2.Open();
                com = new FirebirdSql.Data.FirebirdClient.FbCommand(procedimientoAlmacenado, con2)
                    {
                      CommandType = System.Data.CommandType.StoredProcedure
                    };
                FirebirdSql.Data.FirebirdClient.FbCommandBuilder.DeriveParameters(com);
                con2.Close();
                con2.Dispose();
                ColComandos.Add(procedimientoAlmacenado, com);

            }
            com.Connection = (FirebirdSql.Data.FirebirdClient.FbConnection) Conexion;
            com.Transaction = (FirebirdSql.Data.FirebirdClient.FbTransaction) MTransaccion;
            return com;
        }

        protected override System.Data.IDbCommand ComandoSql(string comandoSql)
        {
            var com = new FirebirdSql.Data.FirebirdClient.FbCommand(comandoSql, (FirebirdSql.Data.FirebirdClient.FbConnection)Conexion, (FirebirdSql.Data.FirebirdClient.FbTransaction) MTransaccion);
            return com;
        }

        protected override System.Data.IDbConnection CrearConexion (string adenaConexion)
        { return new FirebirdSql.Data.FirebirdClient.FbConnection(CadenaConexion); }

        protected override System.Data.IDataAdapter CrearDataAdapter(string procedimientoAlmacenado, params Object[] args)
        {
            var da = new FirebirdSql.Data.FirebirdClient.FbDataAdapter((FirebirdSql.Data.FirebirdClient.FbCommand) Comando(procedimientoAlmacenado));            
            if (args.Length != 0)
                CargarParametros(da.SelectCommand, args);
            return da;
        }

        protected override System.Data.IDataAdapter CrearDataAdapterSql(string comandoSql)
        {
            var da = new FirebirdSql.Data.FirebirdClient.FbDataAdapter((FirebirdSql.Data.FirebirdClient.FbCommand)ComandoSql(comandoSql));
            return da;
        }
        
        public Firebird()
        {
            Base = "";
            Servidor = "";
            Usuario = "";
            Password = "";
        }


        public Firebird(string cadenaConexion)
        { CadenaConexion = cadenaConexion; }


        public Firebird(string servidor, string @base)
        {
            Base = @base;
            Servidor = servidor;
        }


        public Firebird(string servidor, string @base, string usuario, string password)
        {
            Base = @base;
            Servidor = servidor;
            Usuario = usuario;
            Password = password;
        }
    }
}
